#ifndef _VL_RTSP_MEDIA_SESSION__H_
#define _VL_RTSP_MEDIA_SESSION__H_

#include <vector>

#include "defs.h"
#include "media_souce.h"
#include "utils/sync_code.h"
#include "utils/buffer.h"

namespace VLRTSP {

/**
 * @Author: CimZzz
 * @Date: 2022-01-07 11:56:42
 * 
 * 声明 RTSPServer
 */
class RTSPServer;


/**
 * @Author: CimZzz
 * @Date: 2022-01-13 11:16:38
 * 
 * 声明 RTSPContext
 */
class RTSPContext;

/**
 * @Author: CimZzz
 * @Date: 2022-01-07 10:35:10
 * 
 * RTSP 媒体资源会话
 */
class MediaSession {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 15:38:48
	 * 
	 * 构造函数
	 * @param sessionId 会话 Id
	 */
	explicit MediaSession(const char * sessionId);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-07 11:47:52
	 * 
	 * 添加新的媒体资源
	 * 
	 * @param source 媒体资源
	 * 
	 * @note 注意，一旦将媒体资源安装到 RTSP 服务器后，不再允许添加媒体资源
	 */
	void addMediaSource(MediaSource* source);
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 23:06:21
	 * 
	 * 返回媒体会话 Id
	 * @return 媒体会话 Id
	 */
	std::string getSessionId();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 16:37:20
	 * 
	 * 获取 SDP 描述文件
	 * @param ip 访问 IP 地址
	 * @param buffer 字节缓冲区
	 */
	void buildSDP(std::string ip, Buffer* buffer);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 11:05:32
	 * 
	 * 根据媒体资源 Id 找到媒体资源
	 * @param sourceId 媒体资源 Id
	 * @return 找到的媒体资源，如果没找到指针为 nullptr
	 */
	std::shared_ptr<MediaSource> findMediaSource(uint32_t sourceId);
private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-07 11:46:20
	 * 
	 * 声明 RTSPServer 为友元类，操作内部私有方法
	 */
	friend class RTSPServer;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-07 11:57:38
	 * 
	 * 贴附上 RTSP 服务器
	 * @param context RTSP 上下文
	 */
	void _attachRTSPServer(RTSPContext* context);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 15:43:53
	 * 
	 * 判断当前 MediaSession 是否贴附上 RTSPServer
	 */
	bool isAttached = false;
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 15:52:31
	 * 
	 * RTSP 上下文
	 */
	RTSPContext* context;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-13 15:37:52
	 * 
	 * Source Id 发号器
	 */
	SyncCode code;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-12 23:05:39
	 * 
	 * 媒体会话 Id
	 */
	std::string sessionId;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-07 11:53:10
	 * 
	 * 支持的媒体资源列表
	 */
	std::vector< std::shared_ptr<MediaSource> > sourceList;
};

}

#endif //_VL_RTSP_MEDIA_SESSION__H_
